import axios from 'axios';
import { message } from 'ant-design-vue'; // 假设使用 antd 组件库，如不使用可以替换为其他提示组件
import mockData from './mockData'; // 引入 mock 数据

// 判断是否为开发环境
const isDev = process.env.NODE_ENV === 'development';

// 创建 axios 实例
const instance = axios.create({
  baseURL: 'http://47.111.130.2',
  timeout: 15000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
});

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 由于系统没有登录，不需要添加 token
    return config;
  },
  error => {
    console.error('请求拦截器错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  response => {
    const res = response.data;
    
    // 根据后端接口规范判断请求是否成功
    // 通常后端会返回 { code: 200, data: {...}, message: 'success' } 这样的格式
    if (res.code && res.code !== 200) {
      message.error(res.message || '请求失败');
      
      return Promise.reject(new Error(res.message || '请求异常'));
    }
    
    return res;
  },
  error => {
    // 处理 HTTP 状态码错误
    if (error.response) {
      const { status } = error.response;
      let errorMsg = '请求失败';
      
      switch (status) {
        case 400:
          errorMsg = '请求参数错误';
          break;
        case 404:
          errorMsg = '请求资源不存在';
          break;
        case 500:
          errorMsg = '服务器内部错误';
          break;
        default:
          errorMsg = `请求错误 (${status})`;
      }
      
      message.error(errorMsg);
    } else if (error.request) {
      // 请求已发送但未收到响应
      if (error.message.includes('timeout')) {
        message.error('请求超时，请稍后重试');
      } else {
        message.error('网络异常，请检查网络连接');
      }
    } else {
      message.error('请求配置异常');
    }
    
    console.error('响应错误:', error);
    
    // 开发环境下，返回 mock 数据用于调试
    if (isDev) {
      const url = error.config.url;
      const method = error.config.method.toLowerCase();
      
      console.warn(`开发环境检测到接口异常，正在使用 mock 数据: ${method} ${url}`);
      
      // 获取对应的 mock 数据
      const mockResponse = getMockData(url, method);
      
      if (mockResponse) {
        console.info('使用的 mock 数据:', mockResponse);
        return Promise.resolve(mockResponse);
      }
    }
    
    return Promise.reject(error);
  }
);

/**
 * 根据 URL 和请求方法获取对应的 mock 数据
 * @param {string} url - 请求地址
 * @param {string} method - 请求方法
 * @returns {Object|null} mock 数据
 */
function getMockData(url, method) {
  // 移除基础 URL 前缀，以获取纯路径
  const path = url.replace(/^\/api\//, '');
  
  // 匹配 URL 路径参数，如 /users/123 => /users/:id
  const normalizedPath = path.replace(/\/\d+/, '/:id');
  
  // 查找对应的 mock 数据
  const key = `${method}:${normalizedPath}`;
  
  if (mockData[key]) {
    return mockData[key];
  }
  
  // 检查是否有通配符匹配
  const wildcardKey = Object.keys(mockData).find(k => {
    // 将通配符转为正则表达式
    const pattern = k.split(':')[1].replace(/\/\*/g, '\\/.*');
    return new RegExp(`^${pattern}$`).test(normalizedPath);
  });
  
  return wildcardKey ? mockData[wildcardKey] : null;
}

/**
 * GET 请求方法
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @param {Object} config - 其他配置选项
 * @returns {Promise} 请求响应Promise对象
 */
export function get(url, params = {}, config = {}) {
  return instance.get(url, {
    params,
    ...config
  });
}

/**
 * POST 请求方法
 * @param {string} url - 请求地址
 * @param {Object} data - 请求体数据
 * @param {Object} config - 其他配置选项
 * @returns {Promise} 请求响应Promise对象
 */
export function post(url, data = {}, config = {}) {
  return instance.post(url, data, config);
}

// 导出默认实例，以便可以使用其他方法（如put、delete等）
export default instance; 